﻿#pragma once

#include <learn/dll_ext.h>
#include <learn/utils/factory.h>

#include <functional>

namespace xi
{

namespace ais
{

// 前向声明
class EXT_SYMBOL AIS_Object;

class EXT_SYMBOL AIS_Renderer
{
  protected:
    std::size_t m_id;

    /**
     * @brief ID 生成器
     *
     * @return std::size_t
     */
    static std::size_t _gen_id() noexcept;

  public:
    /**
     * @brief 默认构造
     *
     */
    explicit AIS_Renderer();

    /**
     * @brief 默认析构
     *
     */
    virtual ~AIS_Renderer() = default;

    /**
     * @brief 刷新渲染器
     *
     * @param[in] obj
     */
    virtual void update(AIS_Object *obj) = 0;

    /**
     * @brief 绘制物体
     *
     * @param[in] obj
     */
    virtual void draw(AIS_Object *obj) const = 0;
};

// 渲染器工厂
using RendererFactory = utils::GenericFactory<AIS_Renderer, std::string, std::function<AIS_Renderer *()>>;

} // namespace ais

} // namespace xi
